#include <stdio.h>
/*//#ifdef WIN32*/
#include <curses.h>
/*//#else*/
#include <ncurses.h>
/*//#endif*/

#include "NcursJeu.h"
#include <assert.h>
#include <time.h>
#include "Jeu.h"




void transformerTerrainNcurses(Terrain* pTer)
{
    int i, j, tmp;
    for(j=0;j<pTer->nbtiles_hauteur_monde;j++)
	{
		for(i=0;i<pTer->nbtiles_largeur_monde;i++)
		{
            tmp = (int)pTer->schema[i][j];
            if(pTer->tileplein[tmp]==1)
                pTer->schema[i][j]='#';
            else pTer->schema[i][j]='.';
		}
	}
}





void ncursInit(ncursJeu* pNj)
{
    jeuInit(&pNj->Jeu);
    transformerTerrainNcurses(&pNj->Jeu.Ter);
    pNj->Jeu.Ter.HAUTEUR_TILE=1;
    pNj->Jeu.Ter.LARGEUR_TILE=1;
    pNj->Jeu.vx=0;
    scoreInit(pNj->Jeu.Score);
    pNj->perso=InitialiserSprite(pNj->perso,150,150,24,30,&pNj->Jeu.Ter);
	pNj->Jeu.Ter.focusSprite=FocusScrollBox(&pNj->Jeu.Ter,pNj->perso,200,150,0,0);

}

void ncursAff( WINDOW* win, const Jeu *pJeu)
{
	int x,y;

	const Terrain *pTer = getTerrain(pJeu);
	const Personnage *pPer = getPerso(pJeu);

	wclear(win);

	for(x=0;x<getDimX(pTer);++x)
		for(y=0;y<getDimY(pTer);++y)
			mvwprintw(win, y, x, "%c", terGetXY(pTer,x,y));

	mvwprintw(win, persGetY(pPer), persGetX(pPer), "Z");

	wmove(win, persGetY(pPer), persGetX(pPer));
}



/*


//
//
//void ncursBoucle(Jeu *pJeu)
//{
//	WINDOW *win, *screen;
//	int c;
//	int continue_boucle;
//
//	 /* Horloges (en secondes) */
/*//    float horloge_courante, horloge_precedente;
//
//    /* Intervalle de temps (en secondes) entre deux évolutions du jeu */
/*//    /* Changer la valeur pour ralentir ou accélérer le déplacement des fantomes */
/*//    float intervalle_horloge = 0.1f;
//
//	screen = initscr();		/* passe l'écran texte en mode NCurses */
/*//	clear();		/* efface l'écran */
/*//	noecho();  	/* Lorsqu'une touche est préssée au clavier, elle n'apparait pasa à l'écran */
/*//	cbreak();		/* un caractère est directement affiché, il ne passe pas dans un buffer */
/*//
//	/* Creation d'une nouvelle fenetre en mode texte */
/*//	/* => fenetre de dimension et position ( WIDTH, HEIGHT, STARTX,STARTY) */
/*//	win = newwin( getDimY(getTerrain(pJeu)), getDimX(getTerrain(pJeu)), 10, 5 );
/*	keypad(win, TRUE);		/* pour que les flèches soient traitées (il faut le faire après création de la fenêtre) */
/*
//	//halfdelay(temps_dizieme);
//	/* notimeout(win,true); */
/*//	/* wtimeout( win, 500 ); */
/*//	nodelay(win,true); /* Pour que l'appel à wgetch soit non-bloquant */
/*//
//	continue_boucle = 1;
//
//	/* Récupère l'horloge actuelle et la convertit en secondes */
/*//    /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
/*//    horloge_precedente = (float)clock()/(float)CLOCKS_PER_SEC;
//
//    ncursAff( win, pJeu);
//
//	do
//	{
//        /* Récupère l'horloge actuelle et la convertit en secondes */
/*//        /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
/*//        horloge_courante = (float)clock()/(float)CLOCKS_PER_SEC;
//
//        if (horloge_courante-horloge_precedente>=intervalle_horloge)
//        {
//                jeuEvolue(pJeu);
//                ncursAff( win, pJeu);
//                horloge_precedente = horloge_courante;
//        }
//
//
//		c = wgetch(win);
//		/* jeuActionClavier( jeu, 'd'); */
/*//		switch(c)
//		{
//			case KEY_LEFT:
//				actionClavier( pJeu, 'g');
//				ncursAff( win, pJeu);
//				break;
//			case KEY_RIGHT:
//				actionClavier( pJeu, 'd');
//				ncursAff( win, pJeu);
//				break;
//			case KEY_UP:
//				actionClavier( pJeu, 'h');
//				ncursAff( win, pJeu);
//				break;
//			case KEY_DOWN:
//				actionClavier( pJeu, 'b');
//				ncursAff( win, pJeu);
//				break;
//			case 27: /* ECHAP */
/*				continue_boucle = 0;
//				break;
//		}
//	} while (continue_boucle==1);
//
//    assert(delwin(win)!=ERR);
//    assert(delwin(screen)!=ERR);
//
//	endwin();
//}
//*/








void ncursjeuBoucle(ncursJeu* pNj)
{
    int jeutermine=0;
    int finboucle=0;
    char chemin[18];
    /*//const Terrain *pTer= getTerrain(pNj->Jeu);*/
    WINDOW *win , *screen;
	int c;
    screen = initscr();
	clear();
	noecho();
	cbreak();
/*//    printf("getdimx pter %d \n",getDimX(&pNj->Jeu.Ter));
//    printf("getdimy pter %d \n",getDimY(&pNj->Jeu.Ter));*/
    win = newwin( getDimX(&pNj->Jeu.Ter),getDimY(&pNj->Jeu.Ter), 0, 0 );
	keypad(win, TRUE);
	nodelay(win,true);
    ncursAff(win, &pNj->Jeu);
   /*// chargerTerrain(&pNj->Jeu.Tersuiv,selectTerrain(chemin),LARGEUR_FENETRE,HAUTEUR_FENETRE);*/
    c = wgetch(win);
    while(c==27)
	{
	    while(finboucle==0)
	    {
           while(jeutermine==0)
           {
                ncursAff(win, &pNj->Jeu);
                jeuEvolue(&pNj->Jeu);
                if (c==KEY_UP)
                {
                    if((pNj->perso->pPer->posY)>pNj->Jeu.Ter.HAUTEUR_TILE)
                    pNj->Jeu.vy = -2;
                }
                else
                {
                    if((pNj->perso->pPer->posY)<(pNj->Jeu.Ter.nbtiles_hauteur_monde-2)*pNj->Jeu.Ter.HAUTEUR_TILE)
                        pNj->Jeu.vy = 2;
                }
                DeplaceSprite(pNj->perso,pNj->Jeu.vx,pNj->Jeu.vy);
/*//                if(pNj->Jeu.Ter.xscroll%(200)==0)
//                {
//                    CopieProchCarte(&pNj->Jeu.Ter, &pNj->Jeu.Tersuiv);
//                    if(pNj->Jeu.Ter.xscroll%(1000)==0)
//                    {
//                        chargerTerrain(&pNj->Jeu.Tersuiv,selectTerrain(chemin),LARGEUR_FENETRE,HAUTEUR_FENETRE);
//                    }
//                }*/
                jeutermine=persMort(pNj->perso, pNj->Jeu.vx, pNj->Jeu.vy);
            }
/*//            libereTerrain(&pNj->Jeu.Ter);
//            libereTerrain(&pNj->Jeu.Tersuiv);
//            Terrain cartefin;
//            chargerTerrain(&cartefin,"data/NiveauFin.txt",LARGEUR_FENETRE,HAUTEUR_FENETRE);
//            finboucle=1;*/
	    }

	}
//    assert(delwin(win)!=ERR);
//    assert(delwin(screen)!=ERR);
//
//	endwin();
}








void ncursBoucle(Jeu *pJeu)
{
	WINDOW *win, *screen;
	int c;
	int continue_boucle;

	 /* Horloges (en secondes) */
    float horloge_courante, horloge_precedente;

    /* Intervalle de temps (en secondes) entre deux évolutions du jeu */
    /* Changer la valeur pour ralentir ou accélérer le déplacement des fantomes */
    float intervalle_horloge = 0.1f;

	screen = initscr();		/* passe l'écran texte en mode NCurses */
	clear();		/* efface l'écran */
	noecho();  	/* Lorsqu'une touche est préssée au clavier, elle n'apparait pasa à l'écran */
	cbreak();		/* un caractère est directement affiché, il ne passe pas dans un buffer */

	win = newwin( getDimX(&pJeu->Ter),getDimY(&pJeu->Ter), 0, 0 );
	keypad(win, TRUE);
	nodelay(win,true);
	continue_boucle = 1;
    horloge_precedente = (float)clock()/(float)CLOCKS_PER_SEC;
    ncursAff(win, pJeu);

	do
	{
        horloge_courante = (float)clock()/(float)CLOCKS_PER_SEC;
        if (horloge_courante-horloge_precedente>=intervalle_horloge)
        {
                //jeuEvolue (pJeu);
                ncursAff( win, pJeu);
                horloge_precedente = horloge_courante;
        }


            c = wgetch(win);
            actionClavier( pJeu, 'd');
            if(c==KEY_UP)
            {
                actionClavier( pJeu, 'h');
                ncursAff(win,pJeu);

            }
            else  actionClavier( pJeu, 'b');



            switch(c)
            {
                case KEY_UP:
                    actionClavier( pJeu, 'h');
                    ncursAff( win, pJeu);
                    break;
                case 27:
                    continue_boucle = 0;
                    break;
            }

	} while (continue_boucle==1);

    assert(delwin(win)!=ERR);
    assert(delwin(screen)!=ERR);

	endwin();
}

